package org.springframework.beanLifeCycle.postProcessor;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.beans.PropertyValues;
import org.springframework.beans.factory.config.DestructionAwareBeanPostProcessor;
import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor;
import org.springframework.stereotype.Component;

/**
 * @Author: T-jack
 * @Date: 2024-01-03-11:29
 * @Description: bean的后处理器 提供bean生命周期的扩展
 */
@Slf4j
@Component
public class MyBeanPostProcessor implements InstantiationAwareBeanPostProcessor, DestructionAwareBeanPostProcessor {

	@Override
	/**
	 * 销毁前执行的方法
	 */
	public void postProcessBeforeDestruction(Object bean, String beanName) throws BeansException {
		if (beanName.equals("lifeCycleBean"))
			log.debug("<<<<<<<<<<<销毁之前执行");
	}

	@Override
	/**
	 * 实例化前（即调用构造方法前）执行的方法 在调用构造方法之前就会执行
	 * 返回null保持原有对象不变，返回不为null，会替换掉原有对象
	 */

	public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
		if (beanName.equals("lifeCycleBean"))
			log.debug("<<<<<<<<<<< 实例化前执行(构造方法之前)，如@PreDestroy");
		return null;
	}

	@Override
	/**
	 * 实例化后执行的方法
	 * 这里如果返回 false 会跳过依赖注入阶段 true 继续执行依赖注入阶段
	 */

	public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
		if (beanName.equals("lifeCycleBean")) {
			log.debug("<<<<<<<<<<< 实例化后执行(构造方法之后)，这里如果返回 false 会跳过依赖注入阶段");
			// return false;
		}

		return true;
	}

	@Override
	/**
	 * 依赖注入阶段执行的方法 扩展比较多 解析依赖注入注解
	 */

	public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) throws BeansException {
		if (beanName.equals("lifeCycleBean")) {
			log.debug("<<<<<<<<<<< 依赖注入阶段执行，如@Autowired、@Value、@Resource");
			log.debug("<<<<<<<<<<< 依赖注入阶段执行，输出一下这个参数 {}", pvs);
		}

		return pvs;
	}


	@Override
	/**
	 * 初始化之前执行的方法
	 */
	public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
		if (beanName.equals("lifeCycleBean"))
			log.debug("<<<<<<<<<<< 初始化之前执行，这里返回的对象会替换掉原本的bean，如 @PostConstruct、@ConfigurationProperties");
		return bean;
	}

	@Override
	/**
	 * 初始化之后执行的方法
	 */

	public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
		if (beanName.equals("lifeCycleBean"))
			log.debug("<<<<<<<<<<< 初始化之后执行，这里返回的对象会替换掉原本的bean，如 代理增强");
		return bean;
	}
}
